package JavaSE;

class Animal{
    public void makeSound(){
        System.out.println("动物发出一种声音");
    }

    public void sleep(){
        System.out.println("动物在睡觉");
    }

    public void eat(){
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal{
    @Override
    public void makeSound(){
        System.out.println("狗狗在汪汪叫");
    }

    @Override
    public void eat(){
        System.out.println("狗狗在吃大骨头");
    }

    public void fetch(){
        System.out.println("狗狗在玩球");
    }
}
public class 动态绑定 {
    public static void main(String[] args){
        Animal myAnimal = new Dog();//向上转型

        myAnimal.makeSound();//调用子类中重写的父类中的方法

        //myAnimal.fetch();在还没有进行向下转型之前不可以调用子类中特有的方法，会报错

        myAnimal.eat();//调用子类中重写过的方法

        myAnimal.sleep();//调用父类中特有的子类中没有的方法

        /*向下转型法一：
        //进行向下转型
        if(myAnimal instanceof Dog){
            Dog myDog = (Dog) myAnimal;
            myDog.fetch();
        }
        */
        //向下转型法二：直接使用模式匹配进行向下转型
        if(myAnimal instanceof Dog myDog){
            //Dog myDog = (Dog) myAnimal;
            myDog.fetch();
        }
    }
}
